package com.jar.exercise.集合和数据结构.hashmap进阶用法;

import java.util.HashMap;

public class HashMapTest {
	public static void main(String[] args) {
		HashMap<String, Integer> map = new HashMap<>();
		map.put("1", 22);
		map.put("2", 22);
		map.put("3", 22);
		map.put("10", 22);
		map.put("17", 18);
		map.put("19", 18);
		map.put("11", null);
		map.put(null, null);


        /*
          18：不存在  value直接就是《10》
          19：存在 value == 《integer1 和 integer2计算的值放入》
         */
		System.out.println(map.merge("18", 10, (k, v) -> v + 1)); //10
		System.out.println(map.merge("19", 10, (Integer, integer2) -> Integer + integer2)); //28

        /*
          putIfAbsent(K,V)：如果K不存在，就把赋值给V
          return : 原来的value
         */
		System.out.println(map.putIfAbsent("2", 200 + 300)); //22
		System.out.println(map.putIfAbsent("5", 200 + 200)); //null

        /*
          computeIfPresent(K, apply(k,V))：如果K对应的V不为NULL,就执行并且apply,否则直接返回NULL
          应用场景：当这个key对应的value存在，我需要什么逻辑来处理它，一般就是对值进行计算再赋值
         */
        System.out.println(map.computeIfPresent("3", (k, v) -> {
            System.out.println("存在3:" + k);
            System.out.println("存在3:" + v);
            return 1;
        }));
		/*
			因为3存在，所以不执行
		 */
        System.out.println(map.computeIfAbsent("3", (k) -> {
            System.out.println("不存在3:" + k);
            return 1000;
        }));

        /*
          computeIfAbsent(K, apply(k))：如果K对应的V为NULL,就执行并且apply,否则直接返回NULL
          应用场景：当这个key对应的value不存在，我需要什么逻辑来计算出对应的value
         */
        map.computeIfAbsent("13", String::length);

        /*
          compute(K,apply(K,V)) ：如果K对应的value为NULL,就删除对应的K，否则就把计算的值赋给value
         */
        map.compute("11", (K, oldValue) -> null);

        /*
          map.merge(K,newValue,apply(oldValue,newValue))
          如果K对应的value为NULL的话 就把赋值为newValue
          否则就赋值为apply的结果，如果这个apply的返回NULL,就删除这个Key
          return:对应的value
         */
		map.merge("19", 12, (integer, integer2) -> integer + integer2);

		System.out.println(map.toString());

	}

}
